init

FFIB 5 年之前
当前提交
ae4d6dd3c5

+ 14 - 0
.editorconfig

@@ -0,0 +1,14 @@
1
+# https://editorconfig.org
2
+root = true
3
+
4
+[*]
5
+charset = utf-8
6
+indent_style = space
7
+indent_size = 2
8
+end_of_line = lf
9
+insert_final_newline = true
10
+trim_trailing_whitespace = true
11
+
12
+[*.md]
13
+insert_final_newline = false
14
+trim_trailing_whitespace = false

+ 14 - 0
.env.development

@@ -0,0 +1,14 @@
1
+# just a flag
2
+ENV = 'development'
3
+
4
+# base api
5
+APP_BASE_API = 'http://kodo.xfoto.com.cn/api'
6
+
7
+# vue-cli uses the VUE_CLI_BABEL_TRANSPILE_MODULES environment variable,
8
+# to control whether the babel-plugin-dynamic-import-node plugin is enabled.
9
+# It only does one thing by converting all import() to require().
10
+# This configuration can significantly increase the speed of hot updates,
11
+# when you have a large number of pages.
12
+# Detail:  https://github.com/vuejs/vue-cli/blob/dev/packages/@vue/babel-preset-app/index.js
13
+
14
+VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 6 - 0
.env.production

@@ -0,0 +1,6 @@
1
+# just a flag
2
+ENV = 'production'
3
+
4
+# base api
5
+APP_BASE_API = 'http://kodo.xfoto.com.cn/api'
6
+

+ 8 - 0
.env.staging

@@ -0,0 +1,8 @@
1
+NODE_ENV = production
2
+
3
+# just a flag
4
+ENV = 'staging'
5
+
6
+# base api
7
+APP_BASE_API = 'http://kodo.xfoto.com.cn/api'
8
+

+ 4 - 0
.eslintignore

@@ -0,0 +1,4 @@
1
+build/*.js
2
+src/assets
3
+public
4
+dist

+ 198 - 0
.eslintrc.js

@@ -0,0 +1,198 @@
1
+module.exports = {
2
+  root: true,
3
+  parserOptions: {
4
+    parser: 'babel-eslint',
5
+    sourceType: 'module'
6
+  },
7
+  env: {
8
+    browser: true,
9
+    node: true,
10
+    es6: true,
11
+  },
12
+  extends: ['plugin:vue/recommended', 'eslint:recommended'],
13
+
14
+  // add your custom rules here
15
+  //it is base on https://github.com/vuejs/eslint-config-vue
16
+  rules: {
17
+    "vue/max-attributes-per-line": [2, {
18
+      "singleline": 10,
19
+      "multiline": {
20
+        "max": 1,
21
+        "allowFirstLine": false
22
+      }
23
+    }],
24
+    "vue/singleline-html-element-content-newline": "off",
25
+    "vue/multiline-html-element-content-newline":"off",
26
+    "vue/name-property-casing": ["error", "PascalCase"],
27
+    "vue/no-v-html": "off",
28
+    'accessor-pairs': 2,
29
+    'arrow-spacing': [2, {
30
+      'before': true,
31
+      'after': true
32
+    }],
33
+    'block-spacing': [2, 'always'],
34
+    'brace-style': [2, '1tbs', {
35
+      'allowSingleLine': true
36
+    }],
37
+    'camelcase': [0, {
38
+      'properties': 'always'
39
+    }],
40
+    'comma-dangle': [2, 'never'],
41
+    'comma-spacing': [2, {
42
+      'before': false,
43
+      'after': true
44
+    }],
45
+    'comma-style': [2, 'last'],
46
+    'constructor-super': 2,
47
+    'curly': [2, 'multi-line'],
48
+    'dot-location': [2, 'property'],
49
+    'eol-last': 2,
50
+    'eqeqeq': ["error", "always", {"null": "ignore"}],
51
+    'generator-star-spacing': [2, {
52
+      'before': true,
53
+      'after': true
54
+    }],
55
+    'handle-callback-err': [2, '^(err|error)$'],
56
+    'indent': [2, 2, {
57
+      'SwitchCase': 1
58
+    }],
59
+    'jsx-quotes': [2, 'prefer-single'],
60
+    'key-spacing': [2, {
61
+      'beforeColon': false,
62
+      'afterColon': true
63
+    }],
64
+    'keyword-spacing': [2, {
65
+      'before': true,
66
+      'after': true
67
+    }],
68
+    'new-cap': [2, {
69
+      'newIsCap': true,
70
+      'capIsNew': false
71
+    }],
72
+    'new-parens': 2,
73
+    'no-array-constructor': 2,
74
+    'no-caller': 2,
75
+    'no-console': 'off',
76
+    'no-class-assign': 2,
77
+    'no-cond-assign': 2,
78
+    'no-const-assign': 2,
79
+    'no-control-regex': 0,
80
+    'no-delete-var': 2,
81
+    'no-dupe-args': 2,
82
+    'no-dupe-class-members': 2,
83
+    'no-dupe-keys': 2,
84
+    'no-duplicate-case': 2,
85
+    'no-empty-character-class': 2,
86
+    'no-empty-pattern': 2,
87
+    'no-eval': 2,
88
+    'no-ex-assign': 2,
89
+    'no-extend-native': 2,
90
+    'no-extra-bind': 2,
91
+    'no-extra-boolean-cast': 2,
92
+    'no-extra-parens': [2, 'functions'],
93
+    'no-fallthrough': 2,
94
+    'no-floating-decimal': 2,
95
+    'no-func-assign': 2,
96
+    'no-implied-eval': 2,
97
+    'no-inner-declarations': [2, 'functions'],
98
+    'no-invalid-regexp': 2,
99
+    'no-irregular-whitespace': 2,
100
+    'no-iterator': 2,
101
+    'no-label-var': 2,
102
+    'no-labels': [2, {
103
+      'allowLoop': false,
104
+      'allowSwitch': false
105
+    }],
106
+    'no-lone-blocks': 2,
107
+    'no-mixed-spaces-and-tabs': 2,
108
+    'no-multi-spaces': 2,
109
+    'no-multi-str': 2,
110
+    'no-multiple-empty-lines': [2, {
111
+      'max': 1
112
+    }],
113
+    'no-native-reassign': 2,
114
+    'no-negated-in-lhs': 2,
115
+    'no-new-object': 2,
116
+    'no-new-require': 2,
117
+    'no-new-symbol': 2,
118
+    'no-new-wrappers': 2,
119
+    'no-obj-calls': 2,
120
+    'no-octal': 2,
121
+    'no-octal-escape': 2,
122
+    'no-path-concat': 2,
123
+    'no-proto': 2,
124
+    'no-redeclare': 2,
125
+    'no-regex-spaces': 2,
126
+    'no-return-assign': [2, 'except-parens'],
127
+    'no-self-assign': 2,
128
+    'no-self-compare': 2,
129
+    'no-sequences': 2,
130
+    'no-shadow-restricted-names': 2,
131
+    'no-spaced-func': 2,
132
+    'no-sparse-arrays': 2,
133
+    'no-this-before-super': 2,
134
+    'no-throw-literal': 2,
135
+    'no-trailing-spaces': 2,
136
+    'no-undef': 2,
137
+    'no-undef-init': 2,
138
+    'no-unexpected-multiline': 2,
139
+    'no-unmodified-loop-condition': 2,
140
+    'no-unneeded-ternary': [2, {
141
+      'defaultAssignment': false
142
+    }],
143
+    'no-unreachable': 2,
144
+    'no-unsafe-finally': 2,
145
+    'no-unused-vars': [2, {
146
+      'vars': 'all',
147
+      'args': 'none'
148
+    }],
149
+    'no-useless-call': 2,
150
+    'no-useless-computed-key': 2,
151
+    'no-useless-constructor': 2,
152
+    'no-useless-escape': 0,
153
+    'no-whitespace-before-property': 2,
154
+    'no-with': 2,
155
+    'one-var': [2, {
156
+      'initialized': 'never'
157
+    }],
158
+    'operator-linebreak': [2, 'after', {
159
+      'overrides': {
160
+        '?': 'before',
161
+        ':': 'before'
162
+      }
163
+    }],
164
+    'padded-blocks': [2, 'never'],
165
+    'quotes': [2, 'single', {
166
+      'avoidEscape': true,
167
+      'allowTemplateLiterals': true
168
+    }],
169
+    'semi': [2, 'never'],
170
+    'semi-spacing': [2, {
171
+      'before': false,
172
+      'after': true
173
+    }],
174
+    'space-before-blocks': [2, 'always'],
175
+    'space-before-function-paren': [2, 'never'],
176
+    'space-in-parens': [2, 'never'],
177
+    'space-infix-ops': 2,
178
+    'space-unary-ops': [2, {
179
+      'words': true,
180
+      'nonwords': false
181
+    }],
182
+    'spaced-comment': [2, 'always', {
183
+      'markers': ['global', 'globals', 'eslint', 'eslint-disable', '*package', '!', ',']
184
+    }],
185
+    'template-curly-spacing': [2, 'never'],
186
+    'use-isnan': 2,
187
+    'valid-typeof': 2,
188
+    'wrap-iife': [2, 'any'],
189
+    'yield-star-spacing': [2, 'both'],
190
+    'yoda': [2, 'never'],
191
+    'prefer-const': 2,
192
+    'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0,
193
+    'object-curly-spacing': [2, 'always', {
194
+      objectsInObjects: false
195
+    }],
196
+    'array-bracket-spacing': [2, 'never']
197
+  }
198
+}

+ 4 - 0
.github/FUNDING.yml

@@ -0,0 +1,4 @@
1
+# These are supported funding model platforms
2
+
3
+patreon: panjiachen
4
+custom: https://panjiachen.github.io/vue-element-admin-site/donate

+ 33 - 0
.github/ISSUE_TEMPLATE/bug_report.md

@@ -0,0 +1,33 @@
1
+---
2
+name: Bug report(报告问题)
3
+about: Create a report to help us improve
4
+---
5
+<!--
6
+    注意:为更好的解决你的问题,请参考模板提供完整信息,准确描述问题,信息不全的 issue 将被关闭。
7
+
8
+    Note: In order to better solve your problem, please refer to the template to provide complete information, accurately describe the problem, and the incomplete information issue will be closed.
9
+-->
10
+
11
+
12
+## Bug report(问题描述)
13
+
14
+#### Steps to reproduce(问题复现步骤)
15
+<!--
16
+1. [xxx]
17
+2. [xxx]
18
+3. [xxxx]
19
+-->
20
+
21
+#### Screenshot or Gif(截图或动态图)
22
+
23
+
24
+#### Link to minimal reproduction(最小可在线还原demo)
25
+
26
+<!--
27
+Please only use Codepen, JSFiddle, CodeSandbox or a github repo
28
+-->
29
+
30
+#### Other relevant information(格外信息)
31
+- Your OS:
32
+- Node.js version:
33
+- vue-element-admin version:

+ 7 - 0
.github/ISSUE_TEMPLATE/feature_request.md

@@ -0,0 +1,7 @@
1
+---
2
+name: Feature Request(新功能建议)
3
+about: Suggest an idea for this project
4
+---
5
+
6
+## Feature request(新功能建议)
7
+

+ 35 - 0
.github/ISSUE_TEMPLATE/question.md

@@ -0,0 +1,35 @@
1
+---
2
+name: Question(提问)
3
+about: Asking questions about use
4
+---
5
+
6
+## Question(提问)
7
+
8
+<!--
9
+    提问之前,请确定你已经过自己的努力,尝试解决过这个问题。
10
+    若是代码相关问题,请不要只截图,请提供在线 demo,以便节约彼此的时间。
11
+
12
+    Before asking a question, please make sure that you have tried your best to solve this problem.
13
+    If it's a code-related issue, please don't just take screenshots. Please provide an online demo to save each other's time.
14
+-->
15
+
16
+#### Steps to reproduce(问题复现步骤)
17
+<!--
18
+1. [xxx]
19
+2. [xxx]
20
+3. [xxxx]
21
+-->
22
+
23
+#### Screenshot or Gif(截图或动态图)
24
+
25
+
26
+#### Link to minimal reproduction(最小可在线还原demo)
27
+
28
+<!--
29
+Please only use Codepen, JSFiddle, CodeSandbox or a github repo
30
+-->
31
+
32
+#### Other relevant information(格外信息)
33
+- Your OS:
34
+- Node.js version:
35
+- vue-element-admin version:

+ 23 - 0
.gitignore

@@ -0,0 +1,23 @@
1
+.DS_Store
2
+node_modules/
3
+dist/
4
+npm-debug.log*
5
+yarn-debug.log*
6
+yarn-error.log*
7
+**/*.log
8
+
9
+tests/**/coverage/
10
+tests/e2e/reports
11
+selenium-debug.log
12
+
13
+# Editor directories and files
14
+.idea
15
+.vscode
16
+*.suo
17
+*.ntvs*
18
+*.njsproj
19
+*.sln
20
+*.local
21
+
22
+package-lock.json
23
+yarn.lock

+ 5 - 0
.travis.yml

@@ -0,0 +1,5 @@
1
+language: node_js
2
+node_js: 10
3
+script: npm run test
4
+notifications:
5
+  email: false

+ 21 - 0
LICENSE

@@ -0,0 +1,21 @@
1
+MIT License
2
+
3
+Copyright (c) 2017-present PanJiaChen
4
+
5
+Permission is hereby granted, free of charge, to any person obtaining a copy
6
+of this software and associated documentation files (the "Software"), to deal
7
+in the Software without restriction, including without limitation the rights
8
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+copies of the Software, and to permit persons to whom the Software is
10
+furnished to do so, subject to the following conditions:
11
+
12
+The above copyright notice and this permission notice shall be included in all
13
+copies or substantial portions of the Software.
14
+
15
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+SOFTWARE.

+ 0 - 0
README.md


+ 5 - 0
babel.config.js

@@ -0,0 +1,5 @@
1
+module.exports = {
2
+  presets: [
3
+    '@vue/app'
4
+  ]
5
+}

+ 35 - 0
build/index.js

@@ -0,0 +1,35 @@
1
+const { run } = require('runjs')
2
+const chalk = require('chalk')
3
+const config = require('../vue.config.js')
4
+const rawArgv = process.argv.slice(2)
5
+const args = rawArgv.join(' ')
6
+
7
+if (process.env.npm_config_preview || rawArgv.includes('--preview')) {
8
+  const report = rawArgv.includes('--report')
9
+
10
+  run(`vue-cli-service build ${args}`)
11
+
12
+  const port = 9526
13
+  const publicPath = config.publicPath
14
+
15
+  var connect = require('connect')
16
+  var serveStatic = require('serve-static')
17
+  const app = connect()
18
+
19
+  app.use(
20
+    publicPath,
21
+    serveStatic('./dist', {
22
+      index: ['index.html', '/']
23
+    })
24
+  )
25
+
26
+  app.listen(port, function () {
27
+    console.log(chalk.green(`> Preview at  http://localhost:${port}${publicPath}`))
28
+    if (report) {
29
+      console.log(chalk.green(`> Report at  http://localhost:${port}${publicPath}report.html`))
30
+    }
31
+
32
+  })
33
+} else {
34
+  run(`vue-cli-service build ${args}`)
35
+}

+ 24 - 0
jest.config.js

@@ -0,0 +1,24 @@
1
+module.exports = {
2
+  moduleFileExtensions: ['js', 'jsx', 'json', 'vue'],
3
+  transform: {
4
+    '^.+\\.vue$': 'vue-jest',
5
+    '.+\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$':
6
+      'jest-transform-stub',
7
+    '^.+\\.jsx?$': 'babel-jest'
8
+  },
9
+  moduleNameMapper: {
10
+    '^@/(.*)$': '<rootDir>/src/$1'
11
+  },
12
+  snapshotSerializers: ['jest-serializer-vue'],
13
+  testMatch: [
14
+    '**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)'
15
+  ],
16
+  collectCoverageFrom: ['src/utils/**/*.{js,vue}', '!src/utils/auth.js', '!src/utils/request.js', 'src/components/**/*.{js,vue}'],
17
+  coverageDirectory: '<rootDir>/tests/unit/coverage',
18
+  // 'collectCoverage': true,
19
+  'coverageReporters': [
20
+    'lcov',
21
+    'text-summary'
22
+  ],
23
+  testURL: 'http://kodo.xfoto.com.cn/api'
24
+}

+ 9 - 0
jsconfig.json

@@ -0,0 +1,9 @@
1
+{ 
2
+  "compilerOptions": {
3
+    "baseUrl": "./",
4
+    "paths": {
5
+        "@/*": ["src/*"]
6
+    }
7
+  },
8
+  "exclude": ["node_modules", "dist"]
9
+}

+ 114 - 0
package.json

@@ -0,0 +1,114 @@
1
+{
2
+  "name": "vue-element-admin",
3
+  "version": "4.2.1",
4
+  "description": "A magical vue admin. An out-of-box UI solution for enterprise applications. Newest development stack of vue. Lots of awesome features",
5
+  "author": "Pan <panfree23@gmail.com>",
6
+  "license": "MIT",
7
+  "scripts": {
8
+    "dev": "vue-cli-service serve",
9
+    "build:prod": "vue-cli-service build",
10
+    "build:stage": "vue-cli-service build --mode staging",
11
+    "preview": "node build/index.js --preview",
12
+    "lint": "eslint --ext .js,.vue src",
13
+    "test:unit": "jest --clearCache && vue-cli-service test:unit",
14
+    "test:ci": "npm run lint && npm run test:unit",
15
+    "svgo": "svgo -f src/icons/svg --config=src/icons/svgo.yml",
16
+    "new": "plop"
17
+  },
18
+  "husky": {
19
+    "hooks": {
20
+      "pre-commit": "lint-staged"
21
+    }
22
+  },
23
+  "lint-staged": {
24
+    "src/**/*.{js,vue}": [
25
+      "eslint --fix",
26
+      "git add"
27
+    ]
28
+  },
29
+  "keywords": [
30
+    "vue",
31
+    "admin",
32
+    "dashboard",
33
+    "element-ui",
34
+    "boilerplate",
35
+    "admin-template",
36
+    "management-system"
37
+  ],
38
+  "repository": {
39
+    "type": "git",
40
+    "url": "git+https://github.com/PanJiaChen/vue-element-admin.git"
41
+  },
42
+  "bugs": {
43
+    "url": "https://github.com/PanJiaChen/vue-element-admin/issues"
44
+  },
45
+  "dependencies": {
46
+    "axios": "0.18.1",
47
+    "clipboard": "2.0.4",
48
+    "codemirror": "5.45.0",
49
+    "driver.js": "0.9.5",
50
+    "dropzone": "5.5.1",
51
+    "echarts": "4.2.1",
52
+    "element-ui": "2.13.0",
53
+    "file-saver": "2.0.1",
54
+    "fuse.js": "3.4.4",
55
+    "js-cookie": "2.2.0",
56
+    "jsonlint": "1.6.3",
57
+    "jszip": "3.2.1",
58
+    "normalize.css": "7.0.0",
59
+    "nprogress": "0.2.0",
60
+    "path-to-regexp": "2.4.0",
61
+    "qs": "^6.9.3",
62
+    "screenfull": "4.2.0",
63
+    "script-loader": "0.7.2",
64
+    "showdown": "1.9.0",
65
+    "sortablejs": "1.8.4",
66
+    "tui-editor": "1.3.3",
67
+    "vue": "2.6.10",
68
+    "vue-count-to": "1.0.13",
69
+    "vue-router": "3.0.2",
70
+    "vue-splitpane": "1.0.4",
71
+    "vuedraggable": "2.20.0",
72
+    "vuex": "3.1.0",
73
+    "xlsx": "0.14.1"
74
+  },
75
+  "devDependencies": {
76
+    "@babel/core": "7.0.0",
77
+    "@babel/register": "7.0.0",
78
+    "@vue/cli-plugin-babel": "3.5.3",
79
+    "@vue/cli-plugin-eslint": "^3.9.1",
80
+    "@vue/cli-plugin-unit-jest": "3.5.3",
81
+    "@vue/cli-service": "3.5.3",
82
+    "@vue/test-utils": "1.0.0-beta.29",
83
+    "autoprefixer": "^9.5.1",
84
+    "babel-core": "7.0.0-bridge.0",
85
+    "babel-eslint": "10.0.1",
86
+    "babel-jest": "23.6.0",
87
+    "chalk": "2.4.2",
88
+    "chokidar": "2.1.5",
89
+    "connect": "3.6.6",
90
+    "eslint": "5.15.3",
91
+    "eslint-plugin-vue": "5.2.2",
92
+    "html-webpack-plugin": "3.2.0",
93
+    "husky": "1.3.1",
94
+    "lint-staged": "8.1.5",
95
+    "mockjs": "1.0.1-beta3",
96
+    "node-sass": "^4.9.0",
97
+    "plop": "2.3.0",
98
+    "runjs": "^4.3.2",
99
+    "sass-loader": "^7.1.0",
100
+    "script-ext-html-webpack-plugin": "2.1.3",
101
+    "serve-static": "^1.13.2",
102
+    "svg-sprite-loader": "4.1.3",
103
+    "svgo": "1.2.0",
104
+    "vue-template-compiler": "2.6.10"
105
+  },
106
+  "engines": {
107
+    "node": ">=8.9",
108
+    "npm": ">= 3.0.0"
109
+  },
110
+  "browserslist": [
111
+    "> 1%",
112
+    "last 2 versions"
113
+  ]
114
+}

+ 26 - 0
plop-templates/component/index.hbs

@@ -0,0 +1,26 @@
1
+{{#if template}}
2
+<template>
3
+  <div />
4
+</template>
5
+{{/if}}
6
+
7
+{{#if script}}
8
+<script>
9
+export default {
10
+  name: '{{ properCase name }}',
11
+  props: {},
12
+  data() {
13
+    return {}
14
+  },
15
+  created() {},
16
+  mounted() {},
17
+  methods: {}
18
+}
19
+</script>
20
+{{/if}}
21
+
22
+{{#if style}}
23
+<style lang="scss" scoped>
24
+
25
+</style>
26
+{{/if}}

+ 55 - 0
plop-templates/component/prompt.js

@@ -0,0 +1,55 @@
1
+const { notEmpty } = require('../utils.js')
2
+
3
+module.exports = {
4
+  description: 'generate vue component',
5
+  prompts: [{
6
+    type: 'input',
7
+    name: 'name',
8
+    message: 'component name please',
9
+    validate: notEmpty('name')
10
+  },
11
+  {
12
+    type: 'checkbox',
13
+    name: 'blocks',
14
+    message: 'Blocks:',
15
+    choices: [{
16
+      name: '<template>',
17
+      value: 'template',
18
+      checked: true
19
+    },
20
+    {
21
+      name: '<script>',
22
+      value: 'script',
23
+      checked: true
24
+    },
25
+    {
26
+      name: 'style',
27
+      value: 'style',
28
+      checked: true
29
+    }
30
+    ],
31
+    validate(value) {
32
+      if (value.indexOf('script') === -1 && value.indexOf('template') === -1) {
33
+        return 'Components require at least a <script> or <template> tag.'
34
+      }
35
+      return true
36
+    }
37
+  }
38
+  ],
39
+  actions: data => {
40
+    const name = '{{properCase name}}'
41
+    const actions = [{
42
+      type: 'add',
43
+      path: `src/components/${name}/index.vue`,
44
+      templateFile: 'plop-templates/component/index.hbs',
45
+      data: {
46
+        name: name,
47
+        template: data.blocks.includes('template'),
48
+        script: data.blocks.includes('script'),
49
+        style: data.blocks.includes('style')
50
+      }
51
+    }]
52
+
53
+    return actions
54
+  }
55
+}

+ 16 - 0
plop-templates/store/index.hbs

@@ -0,0 +1,16 @@
1
+{{#if state}}
2
+const state = {}
3
+{{/if}}
4
+
5
+{{#if mutations}}
6
+const mutations = {}
7
+{{/if}}
8
+
9
+{{#if actions}}
10
+const actions = {}
11
+{{/if}}
12
+
13
+export default {
14
+  namespaced: true,
15
+  {{options}}
16
+}

+ 62 - 0
plop-templates/store/prompt.js

@@ -0,0 +1,62 @@
1
+const { notEmpty } = require('../utils.js')
2
+
3
+module.exports = {
4
+  description: 'generate store',
5
+  prompts: [{
6
+    type: 'input',
7
+    name: 'name',
8
+    message: 'store name please',
9
+    validate: notEmpty('name')
10
+  },
11
+  {
12
+    type: 'checkbox',
13
+    name: 'blocks',
14
+    message: 'Blocks:',
15
+    choices: [{
16
+      name: 'state',
17
+      value: 'state',
18
+      checked: true
19
+    },
20
+    {
21
+      name: 'mutations',
22
+      value: 'mutations',
23
+      checked: true
24
+    },
25
+    {
26
+      name: 'actions',
27
+      value: 'actions',
28
+      checked: true
29
+    }
30
+    ],
31
+    validate(value) {
32
+      if (!value.includes('state') || !value.includes('mutations')) {
33
+        return 'store require at least state and mutations'
34
+      }
35
+      return true
36
+    }
37
+  }
38
+  ],
39
+  actions(data) {
40
+    const name = '{{name}}'
41
+    const { blocks } = data
42
+    const options = ['state', 'mutations']
43
+    const joinFlag = `,
44
+  `
45
+    if (blocks.length === 3) {
46
+      options.push('actions')
47
+    }
48
+
49
+    const actions = [{
50
+      type: 'add',
51
+      path: `src/store/modules/${name}.js`,
52
+      templateFile: 'plop-templates/store/index.hbs',
53
+      data: {
54
+        options: options.join(joinFlag),
55
+        state: blocks.includes('state'),
56
+        mutations: blocks.includes('mutations'),
57
+        actions: blocks.includes('actions')
58
+      }
59
+    }]
60
+    return actions
61
+  }
62
+}

+ 9 - 0
plop-templates/utils.js

@@ -0,0 +1,9 @@
1
+exports.notEmpty = name => {
2
+  return v => {
3
+    if (!v || v.trim === '') {
4
+      return `${name} is required`
5
+    } else {
6
+      return true
7
+    }
8
+  }
9
+}

+ 26 - 0
plop-templates/view/index.hbs

@@ -0,0 +1,26 @@
1
+{{#if template}}
2
+<template>
3
+  <div />
4
+</template>
5
+{{/if}}
6
+
7
+{{#if script}}
8
+<script>
9
+export default {
10
+  name: '{{ properCase name }}',
11
+  props: {},
12
+  data() {
13
+    return {}
14
+  },
15
+  created() {},
16
+  mounted() {},
17
+  methods: {}
18
+}
19
+</script>
20
+{{/if}}
21
+
22
+{{#if style}}
23
+<style lang="scss" scoped>
24
+
25
+</style>
26
+{{/if}}

+ 55 - 0
plop-templates/view/prompt.js

@@ -0,0 +1,55 @@
1
+const { notEmpty } = require('../utils.js')
2
+
3
+module.exports = {
4
+  description: 'generate a view',
5
+  prompts: [{
6
+    type: 'input',
7
+    name: 'name',
8
+    message: 'view name please',
9
+    validate: notEmpty('name')
10
+  },
11
+  {
12
+    type: 'checkbox',
13
+    name: 'blocks',
14
+    message: 'Blocks:',
15
+    choices: [{
16
+      name: '<template>',
17
+      value: 'template',
18
+      checked: true
19
+    },
20
+    {
21
+      name: '<script>',
22
+      value: 'script',
23
+      checked: true
24
+    },
25
+    {
26
+      name: 'style',
27
+      value: 'style',
28
+      checked: true
29
+    }
30
+    ],
31
+    validate(value) {
32
+      if (value.indexOf('script') === -1 && value.indexOf('template') === -1) {
33
+        return 'View require at least a <script> or <template> tag.'
34
+      }
35
+      return true
36
+    }
37
+  }
38
+  ],
39
+  actions: data => {
40
+    const name = '{{name}}'
41
+    const actions = [{
42
+      type: 'add',
43
+      path: `src/views/${name}/index.vue`,
44
+      templateFile: 'plop-templates/view/index.hbs',
45
+      data: {
46
+        name: name,
47
+        template: data.blocks.includes('template'),
48
+        script: data.blocks.includes('script'),
49
+        style: data.blocks.includes('style')
50
+      }
51
+    }]
52
+
53
+    return actions
54
+  }
55
+}

+ 9 - 0
plopfile.js

@@ -0,0 +1,9 @@
1
+const viewGenerator = require('./plop-templates/view/prompt')
2
+const componentGenerator = require('./plop-templates/component/prompt')
3
+const storeGenerator = require('./plop-templates/store/prompt.js')
4
+
5
+module.exports = function(plop) {
6
+  plop.setGenerator('view', viewGenerator)
7
+  plop.setGenerator('component', componentGenerator)
8
+  plop.setGenerator('store', storeGenerator)
9
+}

+ 5 - 0
postcss.config.js

@@ -0,0 +1,5 @@
1
+module.exports = {
2
+  plugins: {
3
+    autoprefixer: {}
4
+  }
5
+}

二进制
public/favicon.ico


+ 15 - 0
public/index.html

@@ -0,0 +1,15 @@
1
+<!DOCTYPE html>
2
+<html>
3
+  <head>
4
+    <meta charset="utf-8">
5
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
6
+    <meta name="renderer" content="webkit">
7
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
8
+    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
9
+    <title><%= webpackConfig.name %></title>
10
+  </head>
11
+  <body>
12
+    <div id="app"></div>
13
+    <!-- built files will be auto injected -->
14
+  </body>
15
+</html>

+ 11 - 0
src/App.vue

@@ -0,0 +1,11 @@
1
+<template>
2
+  <div id="app">
3
+    <router-view />
4
+  </div>
5
+</template>
6
+
7
+<script>
8
+export default {
9
+  name: 'App'
10
+}
11
+</script>

+ 13 - 0
src/api/dashboard.js

@@ -0,0 +1,13 @@
1
+import request from '@/utils/request'
2
+import store from '@/store'
3
+import qs from 'qs'
4
+
5
+export function fetchDashboard(data) {
6
+  data['brand_id'] = 'ywkRTh5vtswRvhh8uLvTTQ'
7
+  data['admin_id'] = store.getters.token
8
+  return request({
9
+    url: '/admin/dashboard',
10
+    method: 'post',
11
+    data: qs.stringify(data)
12
+  })
13
+}

+ 21 - 0
src/api/order.js

@@ -0,0 +1,21 @@
1
+import request from '@/utils/request'
2
+import store from '@/store'
3
+import qs from 'qs'
4
+
5
+export function fetchList(data) {
6
+  data['admin_id'] = store.getters.token
7
+  return request({
8
+    url: '/admin/order/list',
9
+    method: 'post',
10
+    data: qs.stringify(data)
11
+  })
12
+}
13
+
14
+export function updateOrder(data) {
15
+  data['admin_id'] = store.getters.token
16
+  return request({
17
+    url: '/admin/order/update',
18
+    method: 'post',
19
+    data: qs.stringify(data)
20
+  })
21
+}

+ 25 - 0
src/api/user.js

@@ -0,0 +1,25 @@
1
+import request from '@/utils/request'
2
+import qs from 'qs'
3
+
4
+export function login(data) {
5
+  return request({
6
+    url: '/admin/login',
7
+    method: 'post',
8
+    data: qs.stringify(data)
9
+  })
10
+}
11
+
12
+export function getInfo(token) {
13
+  return request({
14
+    url: '/vue-element-admin/user/info',
15
+    method: 'get',
16
+    params: { token }
17
+  })
18
+}
19
+
20
+export function logout() {
21
+  return request({
22
+    url: '/vue-element-admin/user/logout',
23
+    method: 'post'
24
+  })
25
+}

二进制
src/assets/401_images/401.gif


二进制
src/assets/404_images/404.png


二进制
src/assets/404_images/404_cloud.png


二进制
src/assets/custom-theme/fonts/element-icons.ttf


二进制
src/assets/custom-theme/fonts/element-icons.woff


+ 0 - 0
src/assets/custom-theme/index.css

@@ -0,0 +1 @@